package com.wanho.java156.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.wanho.java156.mapper.RoleMapper;
import com.wanho.java156.mapper.UserMapper;
import com.wanho.java156.po.*;
import com.wanho.java156.util.IDUtil;
import com.wanho.java156.util.MD5Util;
import com.wanho.java156.util.OSSUtil;
import com.wanho.java156.util.SaltUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

@Service
public class UserService {
    private static final Logger LOGGER = Logger.getLogger(UserService.class) ;
    @Autowired
    private UserMapper userMapper ;
    @Autowired
    private RoleMapper roleMapper ;
    @Autowired
    private IDUtil idUtil ;
    @Autowired
    private MD5Util md5Util ;
    @Autowired
    private SaltUtil saltUtil ;
    @Autowired
    private OSSUtil ossUtil ;

    /**
     * 根据 用户名 查询用户对象 【单表查询】
     * @param username 登录 用户名
     * @return  用户信息
     */
    public User findByUsername(String username){
        UserExample userExample = new UserExample();
        userExample.createCriteria().andUsernameEqualTo(username) ;
        List<User> userList = userMapper.selectByExample(userExample);
        return userList.isEmpty()?null:userList.get(0) ;
    }

    /**
     * 分页 + 条件查询
     * @param pageNum 页码 第几页？
     * @param pageSize 分页跨度  每页显示多少行？
     * @param queryStr  模糊查询  用户名  邮箱  电话
     * @return
     */
    public PageInfo<User> list(int pageNum, int pageSize, String queryStr){
        //获取第1页，10条内容，默认查询总数count
        PageHelper.startPage(pageNum, pageSize);
        UserExample userExample = new UserExample();
        //判断是否带模糊条件查询
        if (StringUtils.isNotEmpty(queryStr)){
            UserExample.Criteria criteria = userExample.createCriteria();
            criteria.andUsernameLike("%"+queryStr+"%") ;
        }
        List<User> userList = userMapper.selectByExample(userExample);
        return new PageInfo<>(userList) ;
    }

    /**
     * 新增 用户 【单表新增】
     * @param user
     * @return
     */
    public boolean save(User user) {
        try {
            LOGGER.debug("md5Util===============:"+md5Util);
            //设置id  及  盐值
            String id = idUtil.randId();
            user.setId(id);
            String salt = saltUtil.randSalt();
            user.setSalt(salt);
            //把 用户明文密码 转成密文密码
            user.setPassword(md5Util.md5(user.getPassword(),salt));
            //上传 图片
            MultipartFile userPic = user.getUserPic();
            if (userPic!=null){
                ossUtil.putObject(id+".jpg",userPic.getInputStream());
            }
            return userMapper.insert(user)>0 ;
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e) ;
        }
    }

    /**
     * 根据用户id 查询 获得该用户信息及其对应的角色
     * @param userId
     * @return
     */
    public User findById(String userId){
        return userMapper.selectUserAndRoleByUserId(userId) ;
    }

    /**
     * 用户关联角色
     * 1. 新增了 角色
     * 2. 删除了 角色
     * 3. 修改了 部分角色
     * @param userId
     * @param roleIds
     * @return
     */
    public boolean addRoleToUser(String userId, String[] roleIds) {
        List<String> newRoleId = Arrays.asList(roleIds) ;
        //获得当前用户关联的角色
        User user = userMapper.selectUserAndRoleByUserId(userId);
        List<Role> roles = user.getRoles();
        //该用户没有关联任何角色
        if (roles==null || roles.isEmpty()){
            //直接新增
            roleMapper.insertUserRole(userId,newRoleId) ;
            return  true ;
        }
        //该用户拥有的原来的角色编号
        List<String> oldRoleId = new ArrayList<>() ;
        roles.forEach(role -> oldRoleId.add(role.getId()));
        //比较 两个List
        Iterator<String> newIterator = newRoleId.iterator();
        while (newIterator.hasNext()){
            String newRole = newIterator.next();
            if (oldRoleId.contains(newRole)){
                oldRoleId.remove(newRole) ;
                newRoleId.remove(newRole) ;
            }
        }
        //获得需要新增的List
        if (!newRoleId.isEmpty()) {
            roleMapper.insertUserRole(userId, newRoleId);
        }
        //获得需要删除的List
        if (!oldRoleId.isEmpty()) {
            roleMapper.deleteUserRole(userId, oldRoleId);
        }
        return true;
    }
}
